// Code scaffolded by goctl. Safe to edit.
// goctl 1.9.2

package logic

import (
	"context"
	"encoding/json"
	"fmt"

	"zero_study/user/api_jwt/internal/svc"
	"zero_study/user/api_jwt/internal/types"

	"github.com/zeromicro/go-zero/core/logx"
)

type UserInfoLogic struct {
	logx.Logger
	ctx    context.Context
	svcCtx *svc.ServiceContext
}

func NewUserInfoLogic(ctx context.Context, svcCtx *svc.ServiceContext) *UserInfoLogic {
	return &UserInfoLogic{
		Logger: logx.WithContext(ctx),
		ctx:    ctx,
		svcCtx: svcCtx,
	}
}

func (l *UserInfoLogic) UserInfo() (resp *types.UserInfoResponse, err error) {
	// todo: add your logic here and delete this line
	// 从请求上下文中获取用户ID值
	// 使用Value方法获取键为"user_id"的值，并断言为json.Number类型
	// 注意：json.Number是用于处理JSON数字的字符串表示形式
	userId := l.ctx.Value("user_id").(json.Number)

	// 打印用户ID的值和类型（用于调试）
	// %v: 值, %T: 类型
	fmt.Printf("%v, %T, \n", userId, userId)

	// 从请求上下文中获取用户名
	// 使用Value方法获取键为"username"的值，并直接断言为string类型
	username := l.ctx.Value("username").(string)

	// 将json.Number类型的用户ID转换为int64类型
	// 使用Int64()方法进行转换，并忽略可能的错误（实际生产中应处理错误）
	uid, _ := userId.Int64()

	// 构建并返回用户信息响应
	// 将int64类型的uid转换为uint类型作为用户ID
	// 使用从上下文中获取的用户名
	return &types.UserInfoResponse{
		UserId:   uint(uid), // 用户ID（转换为uint类型）
		Username: username,  // 用户名
	}, nil // 返回nil表示没有错误
}
